""" 
num1 = int(input("请输入第一个数字："))
num2 = int(input("请输入第二个数字："))

res = num1 / num2
print("两个数字相除的结果是：", res)  
"""


# 捕获bug
""" 
try 语句可为一组语句指定异常处理器和/或清理代码:

try_stmt  ::=  try1_stmt | try2_stmt

try1_stmt ::=  "try" ":" suite
               ("except" [expression ["as" identifier]] ":" suite)+
               ["else" ":" suite]
               ["finally" ":" suite]

try2_stmt ::=  "try" ":" suite
               "finally" ":" suite

except 子句指定一个或多个异常处理程序。 
当 try 子句中没有发生异常时，没有任何异常处理程序会被执行。 
当 try 子句中发生异常时，将启动对异常处理程序的搜索。 
此搜索会逐一检查 except 子句直至找到与该异常相匹配的子句。 
如果存在无表达式的 except 子句，它必须是最后一个；它将匹配任何异常。 
对于带有表达式的 except 子句，该表达式会被求值，如果结果对象与发生的异常“兼容”则该子句将匹配该异常。 
如果一个对象是异常对象所属的类或基类，或者是包含兼容该异常的项的元组则两者就是兼容的。

如果没有 except 子句与异常相匹配，则会在周边代码和发起调用栈上继续搜索异常处理器。

当使用 as 将目标赋值为一个异常时，它将在 except 子句结束时被清除。

如果控制流离开 try 子句体时没有引发异常，并且没有执行 return, continue 或 break 语句，可选的 else 子句将被执行。 
else 语句中的异常不会由之前的 except 子句处理。

如果存在 finally，它将指定一个‘清理’处理程序。 
try 子句会被执行，包括任何 except 和 else 子句。 
如果在这些子句中发生任何未处理的异常，该异常会被临时保存。 
finally 子句将被执行。 
如果存在被保存的异常，它会在 finally 子句的末尾被重新引发。 
如果 finally 子句引发了另一个异常，被保存的异常会被设为新异常的上下文。 
如果 finally 子句执行了 return, break 或 continue 语句，则被保存的异常会被丢弃

"""

""" 
try:
  num1 = int(input("请输入第一个数字："))
  num2 = int(input("请输入第二个数字："))

  res = num1 / num2
  print("两个数字相除的结果是：", res)
  
except ZeroDivisionError:
  print("注意：输入错误，除数不能为0。")
except ValueError:
  print("注意：输入错误，输入值必须是数值型。") 
"""

# 以下是多种错误的简写形式
try:
  num1 = int(input("请输入第一个数字："))
  num2 = int(input("请输入第二个数字："))

  res = num1 / num2
  print("两个数字相除的结果是：", res)

except (ZeroDivisionError, ValueError) as e:
  # 简写之后各种错误提示不明显
  print("注意：输入错误。", e)
